623. 500!

 

Для каждого входного n вычислить n!.

 

Вход. Каждая строка содержит значение n (n £ 1000).

 

Выход. Для каждого входного n вывести две строки. Первая строка содержит значение n, за которым следует ‘!’. Вторая строка содержит значение n!.

 

Пример входа

10

30

50

100

 

Пример выхода

10!

3628800

30!

265252859812191058636308480000000

50!

30414093201713378043612608166064768844377641568960512000000000000

100!

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

 

 

РЕШЕНИЕ

длинная арифметика

 

Анализ алгоритма

Воспользуемся классом BigInteger. Вычислим все значения факториалов чисел от 0 до 1000. Для каждого входного n, выводим соответствующее значение n!. Предвычисление факториалов всех чисел обязательно, иначе получим Time Limit.

 

Реализация алгоритма

Установим длину чисел MAXLENGTH равной 3000, значения факториалов будут вычисляться для всех чисел от 0 до MAXN-1. Объявим глобальный массив fact, для которого fact[i]= i!.

 

#define MAXLENGTH 3000

#define MAXN 1001

BigInteger fact[MAXN];

 

Вычисляем все значения fact[i]= i!, i = 0, …, MAXN-1. Для каждого входного i выводим значение fact[i] при помощи функции print.

 

fact[0] = fact[1] = BigInteger(1);

for(i=2;i<MAXN;i++)

  fact[i] = fact[i-1]*i;

while(scanf("%d",&i) == 1)

{

  printf("%d!\n",i);

  fact[i].print();

}